Notes

[Win] OpenCV 管理多摄像头的最简洁方法

问题描述

OpenCV 的一个常见问题是它不支持枚举摄像头,连 StackOverflow 上都只给出过很土的方法(类似于穷举),就是依次增大摄像头编号,然后测试它们能否正常工作。就算是用这种土办法得到摄像头的个数,获取摄像头名称或者调整摄像头参数的功能仍然是 OpenCV 的自带 API 所不具备的。

源码分析

OpenCV 从 2.3 版本开始将内置的摄像头操作类由 VFW 换成了 VideoInput,它主要是对DirectShow的一层封装。通过阅读源码可以看出 OpenCV 只是对 VideoInput 库函数的简单利用,为了实现 OpenCV 自身 API 的跨平台,很多 VideoInput 原本自带的功能例如获取摄像头名称以及设置曝光参数等都被屏蔽掉了。值得庆幸的是,OpenCV 作者在编写这部分代码的时候仅仅是将头文件中的函数名以及数据类型做了简单屏蔽,绝大部分函数体仍然完整存在于 OpenCV 的源代码中并在编译过程中保留了下来。这样只要找到 VideoInput 库自带的头文件,就可以把 VideoInput 的自带函数重新利用起来了。

解决办法

看一下 OpenCV 的源码(搜一下 VideoInput 就行啦),按照里面标出的 VideoInput 版本号(其实一般最新版的 VideoInput 库就可以用)下载对应版本的 VideoInput.h 头文件,并添加至工程即可。就这么简单。

唯一需要注意的是由于 DirectShow 是一个 COM 组件,所以程序开头需要调用一下 CoInitialize,之后便可随意使用 VideoInput 库被屏蔽的所有功能。

适用范围

很明显此方法只限 Windows 下使用。但依据类似原理去调用 Linux / Mac 的摄像头管理函数应当可行。对此有需求者不妨一试。

另外有人的电脑最多只能打开两个 USB 摄像头,打开第三个的时候会失败。大多数情况下这是硬件不支持而导致的。一个解决方案是使用 PCI 多路采集卡。